package com.gitee.wsl.time.wheel

import kotlin.concurrent.Volatile
import kotlin.jvm.Transient

abstract class Reference<T> {
    //引用的对象，由垃圾回收器控制其引用
    private val referent: T? = null

    //所属的引用队列，如果指定了引用队列并且没有入队，那么queue指向的就是指定的引用队列，如果没有指定
    //引用队列，则默认为ReferenceQueue.NULL，如果入队，则queue改为Reference.QUEUE,所以这个变量
    //既可以保存指定的引用队列，也可以作为一个标记判断这个Reference有没有入队
    //设置为volatile是因为有ReferenceHandler线程负责入队操作，即会更改这个queue指向ENQUEUED
    @Volatile
    var queue: ReferenceQueue<in T>? = null

    //引用队列中下一个Reference对象，ReferenceQueue通过这个来维持队列的顺序
    var next: Reference<*>? = null

    //由JVM控制，表示下一个要被回收的对象
    @Transient
    private val discovered: Reference<T>? = null

    //私有锁

    companion object {
        //private val lock = Mutex()

        //引用列表中下一个要进入引用队列的对象(这个引用的对象已经被GC)，由ReferenceHandler线程负责加入队列
        //pending由JVM赋值
        private val pending: Reference<Any>? = null
    }
}